iT邦幫忙

DAY 24
1

從想法到快速實作的捷徑:Rails系列 第 24

[ Day 24 ][ Dev ] 實作角色權限管理 - Part 2

  • 分享至 

  • xImage
  •  

本篇將完成:

  • 將user變為admin user

現在我們已經有了基本的後台,

編輯刪除文章的權限也都設定完成了,

但,我們沒有admin的user呀!

第一個可以直接在rails c改出第一個,或者是從seed裡面去做一個出來,

總不能以後要新增管理員或變更權限都得找工程師進去server裡面改,

所以我們要讓後台有能更新使用者權限的地方。

更改多個物件的屬性

在開始說要做什麼之前,我們先說不能做什麼,

答案就是不能讓admin拔掉自己的admin權限,

因為使用者是邪惡的XD他們總在過奇怪的事情,

根據我的經驗把這個權限拔掉多出來的問題會比不拔少很多。

OK,接著就開始吧!

前面有說過更改權限是藉著users table中的admin column去做到的,

跟資料表操作有關的想到model就對了,

這裡有兩種做法

  1. 新增兩個方法,一個將admin變為true、另一個則把admin變成false

=> 這樣就浪費了boolean特性,我個人偏愛第二種,因為要多寫一個method很不方便。

  1. 新增一個方法,遇到true將它變成false,反之亦然

=> 就是用神奇的 !符號。(這個我們不念驚嘆號,念bang!)

準備好model裡的method

我們會新增一個繼承自user的model,(記得前一篇說的前後檯model分開嗎?)

class Admin::User < User
  def toggle_admin!
    self.admin = !self.admin
  end
end
  • method後面有加個bang的就代表他會對物件現有的值做更動

model準備好之後,我們往controller出發。

先把routes加上去

  namespace :admin do
    resources :posts 
    resources :users do
      collection do
        put :toggle_admin
      end
    end
  end
  • 這裡會有個疑問,what is collection?

如果你是要對單個resource做操作就用member,對多個操作就使用collection,

看不懂這行在說什麼可以執行rake routes測試一下,

在member底下的就會鎖定user的id(因為他是要對每個user作用),

而在collection底下則是直接接在users後面。

搞定之後我們先到view去。

實作選取多個物件的form

  • 其實如果熟html的話這裡可以直接跳過。

    <%= form_tag(toggle_admin_admin_users_path, method: :put) do %>



    譯者
    身份
    文章數


    <% @admin_users.each do |user| %>


    <% unless user.id == current_user.id %>
    <%= check_box_tag "user_ids[]", user.id %>
    <% end %>

    <%= user.name %>
    <%= render_user_role(user) %>
    <%= user.posts.count %>

    <% end %>


    <%= submit_tag "變更使用者權限" %>
    <% end -%>

最重要的就是這行&lt;%= check\_box\_tag "user\_ids[]", user.id %>

到時候params[:user_ids]就可以拿到所有有勾選的user id,

而使用Admin::User.find(params[:user_ids])能一次拿出多個admin_users。

(不過params裡面的是字串,要記得將它轉成integer才能去對應id)

所以我們只要把每個拿出來的user都執行一次我們剛剛在admin_user.rb裡新增的方法就可以了!

class Admin::UsersController < AdminController
  def index
    @admin_users = Admin::User.all
  end

  def toggle_admin
    params[:user_ids] = params[:user_ids].map{|i| i.to_i}
    @admin_users = Admin::User.find(params[:user_ids])
    @admin_users.each do |user|
      user.toggle_admin!
      user.save
    end
    redirect_to admin_users_path 
  end

end

應該會有更好的寫法,這裡只是簡單舉個例子XD

其實只要懂html和ruby基本語法就可以做很多事情了,

Rails就是這麼神奇!

下一篇,也是後台功能的最後一篇將完成:

  • 後台post的發佈功能

上一篇
[ Day 23 ][ Dev ] 實作角色權限管理 - Part 1
下一篇
[ Day 25 ][ Dev ] 實作角色權限管理 - Part 3
系列文
從想法到快速實作的捷徑:Rails30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言